using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using Microsoft.Xna.Framework.Net;
using Microsoft.Xna.Framework.Storage;

namespace TesteIATcc.Entidades
{
    /// <summary>
    /// This is a game component that implements IUpdateable.
    /// </summary>
    public class WaveInimigo : Microsoft.Xna.Framework.GameComponent
    {
        private List<Inimigo> inimigos;
        private int qtdeInimigosWave;
        public bool ondaAtiva = true;

        public List<Inimigo> Inimigos
        {
            get { return inimigos; }
            set { inimigos = value; }
        }

        public WaveInimigo(TesteIA game, string spriteDoInimigo, int qtdeInimigos)
            : base(game)
        {
            this.qtdeInimigosWave = qtdeInimigos;
            this.inimigos = new List<Inimigo>();

            for (int i = 0; i < this.qtdeInimigosWave; i++)
            {
                this.inimigos.Add(new Inimigo(game, "sprites\\inimigo2"));
                base.Game.Components.Add(this.inimigos[i]);
            }

        }

        /// <summary>
        /// Allows the game component to perform any initialization it needs to before starting
        /// to run.  This is where it can query for any required services and load content.
        /// </summary>
        public override void Initialize()
        {
            this.ReposicionaNavesNaTela();
            base.Initialize();
        }

        /// <summary>
        /// Allows the game component to update itself.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        public override void Update(GameTime gameTime)
        {
            //verifica se todos os inimigos estao invisiveis
            bool todosInvisiveis = true;
            for (int i = 0; i <= this.qtdeInimigosWave - 1; i++)
            {
                todosInvisiveis = !this.inimigos[i].SpriteInimigo.Visible;
            }

            if (todosInvisiveis)
            {
                this.ReposicionaNavesNaTela();
            }

            //verifica se o ultimo inimigo saiu da tela
            if ((this.inimigos[this.inimigos.Count - 1].SpriteInimigo.PosicaoSprite.X -
                this.inimigos[this.inimigos.Count - 1].SpriteInimigo.TamanhoSprite.X) <
                (-this.inimigos[this.inimigos.Count - 1].SpriteInimigo.TamanhoSprite.X))
            {
                this.ReposicionaNavesNaTela();
            }

            base.Update(gameTime);
        }

        public void ReposicionaNavesNaTela()
        {
            //reposiciona todas as naves
            int posY = RetornaPosicaoYAleatoria();

            for (int i = 0; i < this.qtdeInimigosWave; i++)
            {
                //se a nave estiver invisivel, deixa ela visivel novamente
                if (!this.inimigos[i].SpriteInimigo.Visible)
                {
                    this.inimigos[i].SpriteInimigo.Visible = true;
                }

                //posiciona a primeira nave logo no fim da tela
                if (i == 0)
                {
                    this.inimigos[i].SpriteInimigo.PosicaoSprite =
                        new Point(base.Game.GraphicsDevice.Viewport.Width + (int)this.inimigos[i].SpriteInimigo.TamanhoSprite.X,
                            posY);
                    this.inimigos[i].desvioPorPassagem = false;
                }

                //as outras naves serao posicionadas logo atras da primeira
                else
                {
                    this.inimigos[i].SpriteInimigo.PosicaoSprite =
                        new Point(this.inimigos[i - 1].SpriteInimigo.PosicaoSprite.X + ((int)this.inimigos[i - 1].SpriteInimigo.TamanhoSprite.X * 2),
                            posY);

                    this.inimigos[i].desvioPorPassagem = false;
                }
            }
        }

        public int RetornaPosicaoYAleatoria()
        {
            Random r = new Random();
            return r.Next(120, 460);
        }
    }
}